﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using IrendilDLL.Database;
using System.Data;
using IrendilDLL;
using System.Data.SqlClient;
using System.IO;
using System.Net.NetworkInformation;
using IrendilDLL.PageControls;

namespace IrendilDLL.PageControls
{
    /// <summary>
    /// Classe di controllo della pagina Server
    /// </summary>
    public class ServerControl
    {
        /// <summary>
        /// Costruttore di default
        /// </summary>
        public ServerControl()
        {
            // Procedo solo se é correttamente inizializzata la variabile di sessione
            installationGUID = (String)HttpContext.Current.Session["installationGUID"];

            // Ottengo la stringa di connessione al db
            localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;

            //// Istanzio la classe di appoggio per il db di irendil
            //irendilDbManager = new IrendilDbManager(localSqlServerStr);
            //// Istanzio la classe di appoggio per il db
            //dbManager = new DataBaseManager(localSqlServerStr);
        }

        /// <summary>
        /// Guid installazione di riferimento
        /// </summary>
        String installationGUID = null;
        /// <summary>
        /// Stringa di connessione al db
        /// </summary>
        string localSqlServerStr = null;
        /// <summary>
        /// Riferimento al file di log
        /// </summary>
        TextWriter logFile;

        /// <summary>
        /// Metodo che torna un datatable contenente i risultati del ping da presentare a monitor
        /// </summary>
        /// <returns></returns>
        public DataTable getPingDT()
        {
            //// Ottengo la stringa di connessione al db
            //string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
            // Istanzio la classe di appoggio per il db
            IrendilDbManager irendilDbManager = new IrendilDbManager(localSqlServerStr);
            irendilDbManager = new IrendilDbManager(localSqlServerStr);
            DataSet hostDs = irendilDbManager.getHostsList(installationGUID);
            
            // Se la query torna dati continuo
            if (hostDs != null && hostDs.Tables.Count > 0)
            {
                // Ottengo il DataTable
                DataTable hostDt = hostDs.Tables[0];
                DataTable serverViewDt = new DataTable();

                // Imposto le colonne
                serverViewDt.Columns.Add("Host");
                serverViewDt.Columns.Add("Description");
                serverViewDt.Columns.Add("descriptionHospital");
                serverViewDt.Columns.Add("HostType");
                serverViewDt.Columns.Add("PrimaryIp");
                serverViewDt.Columns.Add("Esito");
                serverViewDt.Columns.Add("Status");

                // Ciclo su tutte le righe del dt (hosts)
                for (int i = 0; i < hostDt.Rows.Count; i++)
                {
                    // Creo la riga
                    // Ottengo la riga dal dataTable in corso
                    DataRow newRow = serverViewDt.NewRow();
                    // Popolo ciascuna colonna
                    newRow["Host"] = hostDt.Rows[i]["Host"];
                    newRow["Description"] = hostDt.Rows[i]["Description"];
                    newRow["descriptionHospital"] = hostDt.Rows[i]["descriptionHospital"];
                    newRow["HostType"] = hostDt.Rows[i]["HostType"];
                    newRow["PrimaryIp"] = hostDt.Rows[i]["PrimaryIp"];

                    // Dichiaro la variabile che gestirà il ping
                    Ping ping = new Ping();
                    // Controllo le eccezioni per ogni riga
                    try
                    {

                        // Eseguo il ping AGGIUSTARE!!!!
                        PingReply sys_pingreply = ping.Send(hostDt.Rows[i]["PrimaryIp"].ToString(), 500);
                        // Controllo lo stato della risposta
                        if (sys_pingreply.Status == IPStatus.Success)
                        {
                            newRow["Esito"] = "OK";
                            newRow["Status"] = sys_pingreply.Status.ToString();
                        }
                        else
                        {
                            newRow["Esito"] = "NO";
                            newRow["Status"] = sys_pingreply.Status.ToString();
                        }
                    }
                    catch (Exception ex)
                    {
                        newRow["Esito"] = "NO";
                        newRow["Status"] = ex.Message;
                    }

                    // Aggiungo la riga creata
                    serverViewDt.Rows.Add(newRow);
                }

                return serverViewDt;
            }

            else
                return null;
        }

    }
}
